iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Modern Web

.NET教我做人系列 第 23

Day23 DTO是甚麼

  • 分享至 

  • xImage
  •  

昨天我們練習如何在Web API內使用JWT ,如何產生Token ,如何驗證Token 機制與如何驗證Token,而今天的話想要來說說Data Transfer Object(DTO,又稱資料傳輸物件)

ASP.NET CORE 開發中常見的事情是數據傳輸。在這種情況下,我們必須特別注意避免將來出現問題。一個好的做法是使用 DTO,它將定義如何通過網絡發送數據

在 .NET 的應用程序中,例如 API,數據庫中包含的數據被映射並發送到客戶端。如果直接這樣做,可能會出現許多問題,特別是如果您想操縱這些數據的發送和接收方式。要解決這些問題,您可以定義一個 DTO

什麼是DTO

  • DTO是一個定義如何在應用程序之間發送數據的對象
  • 它僅用於發送和接收數據,本身不包含任何業務邏輯

為什麼要使用DTO

  • 將服務層與數據庫層分離
  • 隱藏客戶端不需要接收的特定屬性
  • 省略屬性以減小有效負載大小
  • 操作嵌套對像以使它們對客戶更方便
  • 避免「過度張貼」漏洞

在下面的流程圖中,客戶端向服務器請求 DTO 實體,服務器獲取域實體並在響應中返回 DTO 實體

實際操作

說實話,我個人覺得在使用DTO 時跟我們平常從資料庫抓資料的方式很類似,但就只是我們先把要回傳的實體給寫好而已,話不多說,一開始我們就先拿之前User 的資料表來做練習

在Model下去新增DTO的檔案,檔名就自己設定就好,在之前的User 裡我們新增資料時會依Id、Name、Email、Phone、Sex 的property 來做設定,線自我們先假設我們要的資料只要Name、Email、Phone的話就會寫如下方

 public class UserDetialDto
{
    public string Name { get; set; }
    public string Phone { get; set; }
    public string Email { get; set; }
}

接下來我們就去創一支針對DTO 做使用的API

[HttpGet("UserDetal")]
public async Task<ActionResult<IEnumerable<UserDetialDto>>> GetUserDetalDto()
{
    var user = await _context.Users.Select(u => new UserDetialDto 
                                   { 
                                       Email = u.Email,
                                       Name = u.Name,
                                       Phone = u.Phone 
                                   })
                                   .ToArrayAsync();
    if (user == null)
    {
        return BadRequest();
    }
    return user;
}

在這裡我們再用Select 去使用我們剛剛寫的DTO,這樣的用法很簡單,但在像我們這種比較簡單的例子上感覺不出差異,但是當出現在很大的專案的話,如果每個Controller 都要使用同一個model的話就會不好去維護,所以我們要去習慣使用DTO 的規則

實際結果

最後有發現我們在Select 裡這樣寫的方式好像不是哪麼美觀,這樣每個Property 都還是要自己寫,不如直接new {}就好,所以就有好心人去寫了第三方套件(AutoMapper) 來減少這些程式的出現,這裡就不多說,大家可以去看這些大老的教學

今天雖然介紹的DTO 這東西感覺沒什麼困難的,它的出現一定都有它的意義,所以希望大家會喜歡這次的鐵人賽,那麼就先這樣啦~~~


上一篇
Day22 JWT要怎麼使用
下一篇
Day24 同步與非同步
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言